Processing math: 100%

Codeforces Round 496 Div3

这场没打,补题记录


D

直接标记 %3 的余数,对每个位置进行 check 即可,注意处理 0


E1

题意

给两个数 nm1~n 的乱序序列,问有多少个序列的中位数为 m (偶数个数的区间为区间中间左边的数)

题解

双指针从 m 的位置向两边扫,check 大于 m 和小于 m 的数的数量即可


E2

题意

给两个数 nm 和一个任意序列,问有多少个序列的中位数为 m (偶数个数的区间为区间中间左边的数)

分析

因为可能存在多个m,不能像E1一样可以直接从m的位置两边直接找,直接找到区间为m的数量时间复杂度为n^2,显然不可取
Magic idea: 给一个序列,计算个序列的中位数大于等于 k 的区间个数,这个可以枚举每个位置,设前缀和为sum[],位置i的前缀和为 sumi, 显然我们想统计 sumisumj>=1(j<i)(这个根据把>=m看做+1, < m看做-1,使得中位数为k,可以容易得到)的所有为位置,这个显然可以通过权值线段树维护区间和可以 log 得到。

所有我们可以设 f(k) : 区间中位数 >=m 的个数

答案则是:f(k)f(k+1)

同理我们可以设 f(k) : 区间中位数 <=m 的个数,那么需要统计的区间为 sumisumj<=0(j<i)

答案则是:f(k)f(k1)


F

题意

yige

分析